import Axios, { AxiosInstance } from 'axios'
import { ElMessage } from 'element-plus'
import { getToken } from './auth'
import router from '@/router'
const baseURL = 'http://127.0.0.1:7001'

import { showLoading, hideLoading } from "../utils/loading";
import { store } from '@/store'

const axios: AxiosInstance = Axios.create({
  baseURL,
  timeout: 20000 // 请求超时 20s
})

// 前置拦截器（发起请求之前的拦截）
axios.interceptors.request.use(
  (config) => {
    // 请求拦截进来调⽤显⽰loading效果
    showLoading();
    /**
     * 根据你的项目实际情况来对 config 做处理
     * 这里对 config 不做任何处理，直接返回
     */
    if(getToken()){
      config.headers.Authorization = `${getToken()}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 后置拦截器（获取到响应时的拦截）
axios.interceptors.response.use(
  (response) => {
    // 响应拦截进来隐藏loading效果，此处采⽤延时处理是合并loading请求效果，避免多次请求loading关闭⼜开启
    setTimeout(() => {
      hideLoading();
    }, 200);
    if(response.status === 401){
      store.dispatch('userModule/refreshToken')  // 刷新token
    }
    /**
     * 根据你的项目实际情况来对 response 和 error 做处理
     * 这里对 response 和 error 不做任何处理，直接返回
     */
    return response
  },
  (error) => {
    setTimeout(() => {
      hideLoading();
    }, 200);
    if (error.response && error.response.data) {
      const status = error.response.status
      const msg = error.response.data.message
      const code = error.response.data.code
      if(code === 10003){
        ElMessage.error('登录过期，请重新登录');
        router.push('/login')
      }else if(code === 10001){
        ElMessage.error('令牌错误，请重新登录');
        router.push('/login')
      }else{
        ElMessage.error(`statusCode: ${status}, Message: ${msg}`)
      }
      // console.error(`[Axios Error]`, error.response)
    } else {
      ElMessage.error(`${error}`)
    }
    return Promise.reject(error)
  }
)

export default axios
